package simulacion.control;

import java.util.SortedSet;
import java.util.TreeSet;

import compartido.IComparadorDeTransacciones;
import compartido.ITransaccion;

public class ActivarTransaccionesSinDormirlas implements IPlanificador {

	protected SortedSet<ITransaccion> activables;
	protected IComparadorDeTransacciones orden;
	protected Long instante;
	
	public ActivarTransaccionesSinDormirlas() {
		activables = new TreeSet<ITransaccion>();
		orden = null;
		instante = (long)0;
	}
	
	@Override
	public boolean activar(ITransaccion activable) {
		boolean activado = activables.contains(activable);
		if (activado)
			activable.activar();
		return activado;
	}
	
	@Override
	public boolean despertar(ITransaccion activable) {
		return activar(activable);
	}

	/* 
	 * @brief Un ActivarTodos no duerme ninguna transacción.
	 */
	@Override
	public void dormir(ITransaccion activable, int tiempo) {
	}

	@Override
	public long getInstante() {
		return instante.longValue();
	}

	@Override
	public boolean registrar(ITransaccion activable) {
		boolean registrado = !activables.contains(activable);
		if (registrado)
			activables.add(activable);
		return registrado;
	}

	@Override
	public boolean remover(ITransaccion activable) {
		boolean eliminado = activables.contains(activable);
		if (eliminado)
			activables.remove(activable);
		return eliminado;
	}

	@Override
	public void setOrden(IComparadorDeTransacciones orden) {
		if ((this.orden != orden) && (orden != null) ){
			SortedSet<ITransaccion> nuevo = new TreeSet<ITransaccion>(orden);
			
			nuevo.addAll(activables);
			
			this.orden = orden;
			this.activables = nuevo;
		}
	}

	@Override
	public long siguienteInstante() {
		if (tieneSiguienteInstante()) {
			for (ITransaccion t : activables)
				t.activar();
			instante++;
		}
		return instante;
	}

	@Override
	public boolean tieneSiguienteInstante() {
		return !activables.isEmpty();
	}
}
